// pages/cart/index.js
import { chooseAddress, showToast } from "../../utils/wxAsync.js";
import regeneratorRuntime from '../../lib/runtime/runtime.js';

Page({
  /**
   * 页面的初始数据
   */
  data: {
    address:{},
    cart:[],
    allChecked:false,
    haveGoods:false,
    allPrice:0,
    allNum:0,
    isLogin: false
  },
    /**
   * 生命周期函数--监听页面显示
   */
  onShow: function(){
    const address = wx.getStorageSync('address');
    const cart = wx.getStorageSync('cart') || [];
    const allChecked = this.checkAllFunction();
    const haveGoods = cart.length !== 0 ? true : false;
    const userInfo = wx.getStorageSync('userInfo') || {};
    const isLogin = Object.keys(userInfo).length === 0 ? false : true;
    // console.log(selected_goods);
    this.priceChange();
    this.numChange();
    this.setData({
        address,
        cart,
        allChecked,
        haveGoods,
        isLogin
      });
  },

  goodsNumChange(e){
    // console.log(e);
    const cart = wx.getStorageSync('cart');
    const op = e.currentTarget.dataset.op;
    const goods_id = e.currentTarget.dataset.id;
    const index = cart.findIndex(v=>v.goods_id === goods_id);
    // console.log(index);
    // const theGood = cart.filter(v=>v.goods_id === goods_id);
    // const new_cart = cart.filter(v=>v.goods_id !== goods_id);
    // theGood.num += op;
    // new_cart.push(theGood);
    if(op === 1){
      cart.forEach((v)=>{v.goods_id === goods_id ? v.num = v.num + op : v.num = v.num + 0});
    }else{
      // op === -1
      // console.log(cart[index].num);
      // console.log(cart);
      if(cart[index].num === 1){
        // 数量为1
        wx.showModal({
          cancelColor: 'cancelColor',
          title:'提示',
          content:'要删除该商品？',
          success:(res)=>{
            if(res.confirm){
              // console.log('用户点击确定');
              // 1.用splice方法删除
              this.deleteGood(goods_id);
            }else if(res.cancel){
               console.log('用户取消删除');
            }else{

            }
          }
        })
      }else{

        // 数量不为1
        cart.forEach((v)=>{v.goods_id === goods_id ? v.num = v.num + op : v.num = v.num + 0});
      } 
    }
    wx.removeStorageSync('cart');
    wx.setStorageSync('cart', cart);
    this.priceChange();
    this.numChange();
    this.setData({
      cart
    })
  },


  setHaveGoods(cart){
    return cart.length === 0 ? false : true;
  },

  deleteGood(goods_id){
    const cart = wx.getStorageSync('cart');
    const index = cart.findIndex(v=>v.goods_id === goods_id);
    cart.splice(index, 1);
    wx.removeStorageSync('cart');
    wx.setStorageSync('cart', cart);
    const haveGoods = this.setHaveGoods(cart);
    this.setData({
      cart,
      haveGoods
    })
  },

  priceChange(){
    let count = 0;
    const cart = wx.getStorageSync('cart');
    if(cart.length !== 0){
      const selected_goods = cart.filter(v=>v.selected === true);
    // console.log(selected_goods);
    if(selected_goods.length !== 0){
      selected_goods.forEach((v)=>{count = count + v.goods_price * v.num});
    }
    }
    
    this.setData({
      allPrice:count
    })
  },

  numChange(){
    let count = 0;
    const cart = wx.getStorageSync('cart');
    if(cart.length !== 0){
      const selected_goods = cart.filter(v=>v.selected === true);
    selected_goods.forEach((v)=>{count += v.num});
    }
    
    this.setData({
      allNum: count
    })
  },

  /*
      1. 判断是否存在商品：用haveGoods判断
      2. 判断用户是否填写地址
      3. 跳转到结算页面
   */
  async handlePay(){
    const { address } = this.data;
    if(!address.userName){
      await showToast({title:'您还没有选择收获地址'});
      return;
    }

    const cart = wx.getStorageSync('cart');
    const new_cart = cart.filter(v=>v.selected === true);
    if(new_cart.length === 0){
      await showToast({title:'您未选商品'});
      return;
    }
    wx.navigateTo({
      url: '/pages/pay/index',
    })
  },
/*
  1.点击单选框，触发select事件
  2.e中有index 和 preselected,goods_id
  3.在select事件中：
    1.goods_id通过找到data值中的对象
    2.更新data数据中对应商品的selected值，取反即可
    3.更新缓存

  -----------------------------
  1.获取页面传来的index
  2.通过index获取data对象
  3.更新data对象中的selected对象的值
*/

//单选
select: function (e) {
  // console.log(e);
  // 肯定是有缓存才点得到
  // const curGoods_id = e.currentTarget.dataset.id;
  const index = e.currentTarget.dataset.index;
  // const preselected = e.currentTarget.dataset.preselected;
  const cur_cart = wx.getStorageSync('cart');
  wx.removeStorageSync('cart');
  const flag = cur_cart[index].selected
  cur_cart[index].selected = !flag;
  wx.setStorageSync('cart', cur_cart);
  const allChecked = this.checkAllFunction();
  this.priceChange();
  this.numChange();
  this.setData({
    cart: cur_cart,
    allChecked
  });
},

// idea：当缓存中存在商品时，才将全选框显示出来  √


/*
  全选/全不选逻辑
  1. 点击按钮，触发事件
  2.判断当前缓存中的每一个对象的selected属性是否全为true
    1.若全为true，全部置为false,更新缓存和data中的数据
    2.若不全是true，全部置为true，更新缓存和data中的数据
 */
  allOrNone(e){
    // console.log(this.data.allChecked);
    // 缓存中无数据的话，按钮都不会显示出来，不会触发此事件
    const cart = wx.getStorageSync('cart');
    // const new_cart = cart.filter(v=>v.selected === true);
    // if(cart.length === new_cart.length){
    //   // 全为true，全置为false

    // }else{
    //   // 不全为true，全置为true
    // }
    
    const flag = !this.data.allChecked;
    cart.forEach(v=>v.selected = flag);
    wx.setStorageSync('cart', cart);
    this.priceChange();
    this.numChange();
    this.setData({
      allChecked:flag,
      cart
    })
  },


  checkAllFunction(){
    const cart = wx.getStorageSync('cart');
    return cart.length ? cart.every(v=>v.selected) : false;
  },



  async handleChooseAddress(){
    // 可以直接获取，通讯地址（已取消授权，可以直接调用对应接口）
    // 封装
    try {
      const address = await chooseAddress();
      console.log(address);
      wx.setStorageSync('address', address);
    } catch (error) {
      console.log(error);
    }
  },
  
  /* 
  生命周期函数onLoad与onShow的区别
    onLoad: 页面加载时触发，从二级页面回来时不会触发。
    onshow: 当小程序启动，或从后台进入前台显示，会触发 onShow, 从二级页面回来时也会触发。
   */
  

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },




  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})


 /* 
  获取收获地址逻辑
    1.获取设置权限，取收获地址权限（通过属性authSetting中的键：scope.address），它可以为 true(用户已经授权可以获取收获地址), 
                                          undefined(用户未使用过该功能，即既未授权也未拒绝)
                                          false(用户曾经拒绝授权获取收获地址)
    2.如果scope.address的值为true或undefined，可以运行获取收获地址代码
    3.如果scope.address的值为false，不能获取收获地址，诱导用户是否重新赋予权限



    ！！！！！！！！！！！！問題：authSetting中的键：scope.address一直为true
   */
   /* 
   旧的方式
   handleAddAddress:function(){
    wx.getSetting({
      success: (res) => {
        const scopeAddress = res.authSetting["scope.address"];
        console.log(scopeAddress);
        if(scopeAddress === false || scopeAddress === undefined){
          // 诱导重新赋予权限
          wx.openSetting({
            success: (res2) => {
              wx.chooseAddress({
                success: (res3) => {
                  console.log(res3);
                },
              })
            },
          })
        }else{
          // 获取收获地址
          wx.chooseAddress({
            success: (res1) => {console.log(res1);}
          })
        }
      }
    })
  },
    */
